<?php

namespace App\Http\Controllers\Pay;

use App\Package\AliPay\Base;
use Illuminate\Support\Facades\Log;

class Pay extends Base
{
    /**
     * 充值
     *
     * Date: 2018/07/14
     * @author Tenny
     * @param $id  商户转账订单号
     * @param $amount  充值金额2位小数 [0.01,100000000]
     * @param $title
     * @return true
     */
    public function newPay($id, $amount, $title = '网点充值')
    {
        //公共参数
        $pub_params = [
            'app_id' => env('APPID', ''),
            'method' => 'alipay.trade.page.pay', //接口名称 应填写固定值alipay.trade.page.pay
            'format' => 'JSON', //目前仅支持JSON
            'return_url' => env('REURL', ''), //同步返回地址
            'charset' => 'UTF-8',
            'sign_type' => 'RSA2',//签名方式
            'sign' => '', //签名
            'timestamp' => date('Y-m-d H:i:s'), //发送时间 格式0000-00-00 00:00:00
            'version' => '1.0', //固定为1.0
            'notify_url' => env('NOURL', ''), //异步通知地址
            'biz_content' => '', //业务请求参数的集合
        ];

        //业务参数
        $api_params = [
            'out_trade_no' => $id,
            'product_code' => 'FAST_INSTANT_TRADE_PAY', //销售产品码 固定值
            'total_amount' => round($amount, 2),
            'subject' => $title,
        ];
        $pub_params['biz_content'] = json_encode($api_params, JSON_UNESCAPED_UNICODE);

        $pub_params = $this->setRsa2Sign($pub_params);
        $url = env('NEW_PAYGATEWAY', '') . '?' . $this->getUrl($pub_params);
        header("location:" . $url);
        return true;
    }

    /**
     * 转账
     *
     * Date: 2018/07/14
     * @author Tenny
     * @param $id  商户转账订单号
     * @param $payee_account  支付宝账户
     * @param $amount  充值金额2位小数 [0.01,100000000]
     * @return true
     */
    public function transfer($id, $payee_account, $amount)
    {
        //公共请求参数
        $pub_params = [
            'app_id' => env('APPID', ''),
            'method' => 'alipay.fund.trans.toaccount.transfer', //接口名称 应填写固定值alipay.fund.trans.toaccount.transfer
            'format' => 'JSON', //目前仅支持JSON
            'charset' => 'UTF-8',
            'sign_type' => 'RSA2',//签名方式
            'sign' => '', //签名
            'timestamp' => date('Y-m-d H:i:s'), //发送时间 格式0000-00-00 00:00:00
            'version' => '1.0', //固定为1.0
            'biz_content' => '', //业务请求参数的集合
        ];

        //请求参数
        $api_params = [
            'out_biz_no' => $id,
            'payee_type' => 'ALIPAY_LOGONID', //收款方账户类型
            'payee_account' => $payee_account, //收款方账户
            'amount' => $amount, //金额
        ];
        $pub_params['biz_content'] = json_encode($api_params, JSON_UNESCAPED_UNICODE);
        $pub_params = $this->setRsa2Sign($pub_params);

        $result = iconv('gbk', 'utf-8', $this->curlRequest(env('TRANSFER', ''), $pub_params));
        return $result;
    }

    /**
     * 支付回调
     *
     * Date: 2018/07/14
     * @author Tenny
     * @return true
     */
    public function notify()
    {
        // 1.获取数据
        $postData = $_POST;

        //2.验证签名MD5和RSA
        if ($postData['sign_type'] == 'MD5') {
            if (!$this->checkSign($postData)) {
                Log::info('MD5签名失败!', $postData);
                exit();
            } else {
                $this->logs('log.txt', 'MD5签名成功!');
            }
        } elseif ($postData['sign_type'] == 'RSA') {
            if (!$this->rsaCheck($this->getStr($postData), self::ALIPUBKEY, $postData['sign'])) {
                $this->logs('log.txt', 'RSA签名失败!');
                exit();
            } else {
                $this->logs('log.txt', 'RSA签名成功!');
            }
        } elseif ($postData['sign_type'] == 'RSA2') {
            if (!$this->rsaCheck($this->getStr($postData), self::NEW_ALIPUBKE, $postData['sign'], 'RSA2')) {
                $this->logs('log.txt', 'RSA2签名失败!');
                exit();
            } else {
                $this->logs('log.txt', 'RSA2签名成功!');
            }
        } else {
            exit('签名方式有误');
        }
        //验证是否来自支付宝的请求
        if (!$this->isAlipay($postData)) {
            $this->logs('log.txt', '不是来之支付宝的通知!');
            exit();
        } else {
            $this->logs('log.txt', '是来之支付宝的通知验证通过!');
        }
        // 4.验证交易状态
        if (!$this->checkOrderStatus($postData)) {
            $this->logs('log.txt', '交易未完成!');
            exit();
        } else {
            $this->logs('log.txt', '交易成功!');
        }
        //5. 验证订单号和金额
        //获取支付发送过来的订单号  在商户订单表中查询对应的金额 然后和支付宝发送过来的做对比
        $this->logs('log.txt', '订单号:' . $postData['out_trade_no'] . '订单金额:' . $postData['total_amount']);

        //更改订单状态
        echo 'success';
    }

}